<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>


        // prototype 原型对象   只有函数拥有  提供共有的属性和方法

        // __proto__  原型    只有对象拥有__proto__  判断一个对象是否拥有某个属性和方法，就要不断去找原型

        function Dog(name) {
            this.name = name ;
        }
        Dog.prototype.say = function() {
            console.log('汪');
        }

        const d1 = new Dog('柯基') ;

        console.log(d1);

        // d1.fn()

        // d1.say()

        // 实例化对象的原型 指向了  构造函数的原型对象

        // 实例化对象的原型指向构造函数的原型对象
        // 构造函数的原型对象的原型指向对象的原型对象
        // 对象的原型对象的原型 指向 null

        console.log(d1.__proto__ === Dog.prototype);   // true

        console.log(Dog.prototype.__proto__ === Object.prototype);   // true

        console.log(Object.prototype.__proto__ == null);   // true


        console.log(d1.constructor);



        const arr = [1,2] ;
        console.log(arr);

        console.log(arr.__proto__ === Array.prototype); 
        console.log(Array.prototype.__proto__ === Object.prototype);







        console.log(Dog.__proto__ === Function.prototype);

        console.log(Function.prototype.__proto__ === Object.prototype);

        console.log(Object.prototype.__proto__ === null);



        // const fn = new Function();


        // Dog.__proto__   Function.prototype 

        // Function.prototype.__proto__  Object.prototype

        // Object.prototype.__proto__    null


    </script>
    
</body>
</html>